<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
    <script>
        //定义对象，
        var object={
            name:"web前端高级开发",
            study:function(){
                document.write("我正在学习");
            }
        };
        //调用对象里面的属性
        document.write(object.name);
        //调用对象里面的方法
        object.study();
        //定义一个变量用来存储属性姓名
        var key='grade';
        //将属性赋值
        object[key]='大一';
        //可以直接通过对象名，可变属性访问
        document.write(object.grade);
        //通过for..in遍历对象 key代表每个对象属性名称
        for(var key in object){
            console.log(key+"-"+object[key]);
        
        }
        object[study]();// //调用成员方法
        document.write("sex" in object);//通过in判断对象是否含有属性 有返回true,否则返回false
        document.write("name" in object);
        
        //通过构造方法创建对象
        var object1=new Object();//创建object对象
        var str=new String("123"); //创建string对象
        console.log(object1.constructor);//查看object对象是哪个构造函数创建的
        console.log(str.constructor);//查看string对象是哪个构造函数创建的

        //自定义构造函数创建对象
        function Person(name,age){
            this.name=name;
            this.age=age;
            this.sayHello=function(){
                document.write(name+"Hello world"+age);
            };
        }
        //通过new关键字创建对象（构造函数）
        var p1=new Person("小",22);
        p1.sayHello(); //通过实例化后的对象名，构造函数内部的方法
        
        //自定义Dog构造函数
        function Dog(){
            var name="二哈"; //var关键字申明的属性为私有成员
            this.getName=function(){
                return name; //通过成员方法去访问构造函数中的私有成员属性
            }
        }

        var dog =new Dog();
        console.log(dog.name); //通过实例化后的对象名去访问对象中的私有成员，结果返回underfined
        console.log(dog.getName);//通过实例化后的对象名去访问对象的方法，返回私有成员的值
        
        function Cat(){
        obj = this;
        return{};//因为当前返回的是引用类型，则会返回对象或者数组，如果是基本属猪类型String,int则返回的是院队象即Cat
    }

    var obj, p = new Cat();
    console.log(obj);
    console.log(p);

    function func(){
        console.log(this.name);
    }
    func.apply({name:"小"});//通过apply方法去改变this指向
    func.call({name:"大"});

    function sum(a,b){
        console.log(a+b);
    }
    sum.apply({},['1','2']);//第一个参数代表的是空的第一个对象，第二个参数代表传参 与call不同是通过数组传递
    sum.call({},'3','4');//第二个参数是代表任意参数传递
    
    </script>


</html>